package util

import (
	"bufio"
	"io"
	"os"
	"path/filepath"
)

// FileExists 判断文件是否存在
//
// filePath 判断的文件或者文件夹
//
// 返回是否存在
func FileExists(filePath string) bool {
	_, e := os.Stat(filePath)
	if e == nil {
		return true
	}
	return !os.IsNotExist(e)
}

// MkdirIfNotExists 如果指定文件夹不存在，则创建文件夹，包括多级路径
//
// filePath 指定创建的路径
//
// 若创建失败，则返回错误对象
func MkdirIfNotExists(filePath string) error {
	if !FileExists(filePath) {
		e := os.MkdirAll(filePath, 0755)
		if e != nil {
			return e
		}
	}
	return nil
}

// ListAllFile 递归获取文件列表
//
// dirPath 要列举的文件夹
// fileList 存放文件列表结果的切片
func ListAllFile(dirPath string, fileList *[]string) {
	// 遍历当前文件夹
	list, _ := os.ReadDir(dirPath)
	// 进行遍历
	for _, file := range list {
		// 如果是文件夹，则进入递归遍历
		if file.IsDir() {
			ListAllFile(filepath.Join(dirPath, file.Name()), fileList)
		} else {
			// 如果是文件，加入到文件结果列表
			*fileList = append(*fileList, filepath.Join(dirPath, file.Name()))
		}
	}
}

// ReadDataFromFile 读取文件内容
//
// path 文件路径
//
// 返回读取的字节内容
func ReadDataFromFile(path string) ([]byte, error) {
	// 打开文件
	file, e := os.OpenFile(path, os.O_RDONLY, 0755)
	if e != nil {
		return nil, e
	}
	defer func() {
		_ = file.Close()
	}()
	// 读取文件
	reader := bufio.NewReader(file)
	return io.ReadAll(reader)
}